package com.eight.paper.admin.service;

import com.eight.paper.admin.domain.QuestionBase;
import com.eight.paper.admin.domain.QuestionVersion;
import com.eight.paper.admin.domain.model.MonitorResult;
import com.eight.paper.admin.domain.model.QuestionTemplate;
import com.eight.paper.admin.domain.model.QuestionListBody;
import com.eight.paper.admin.domain.model.enums.QuestionSourceEnum;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

/**
 * 试题管理Service接口
 * 
 * @author 爱考线上考试系统
 * @date 2023-10-04
 */
public interface IQuestionBaseService 
{
    /**
     * 查询试题管理
     * 
     * @param id 试题管理主键
     * @return 试题管理
     */
    public QuestionBase selectQuestionBaseById(Integer id);

    /**
     * 获取试题信息
     *
     * @param id 试题管理主键
     * @return 试题信息
     */
    public QuestionBase selectQuestionBodyById(Integer id);

    /**
     * 获取试题信息
     *
     * @param id 试题管理主键
     * @param score 每题分数
     * @param type 1试题全部信息 2：去除答案和解析
     * @return 试题信息
     */
    public QuestionBase selectQuestionBodyById(Integer id,BigDecimal score,String type);

    /**
     * 获取试题信息
     *
     * @param id 试题管理主键
     * @return 试题信息
     */
    public QuestionBase selectQuestionBody(Integer id, BigDecimal score, String type, Integer versionId, Integer paperQuestionId);

    /**
     * 根据版本表数据获取试题信息
     * @param baseId
     * @param score
     * @param type
     * @param version
     * @param questionVersionId
     * @return
     */
    public QuestionBase selectQuestionBodyFromVersion(Integer baseId, BigDecimal score, String type, QuestionVersion version, Integer questionVersionId);

    /**
     * 获取试题信息
     *
     * @param id 试题管理主键
     * @return 试题信息
     */
    public QuestionBase selectQuestionBody(Integer id, BigDecimal score, String type, Integer versionId, Integer paperQuestionId,String subScores);

    /**
     * 获取试题信息
     *
     * @param questionBase 试题基础信息
     * @return 试题信息
     */
    public QuestionBase selectQuestionBody(QuestionBase questionBase,BigDecimal score,String type,Integer versionId,Integer paperQuestionId,String subScores);

    /**
     * 查询试题管理列表
     * 
     * @param questionBase 试题管理
     * @return 试题管理集合
     */
    public List<QuestionListBody> selectQuestionBaseList(QuestionListBody questionBase);

    /**
     * 新增试题管理
     *
     * @param questionBase 试题管理
     * @return 结果
     */
    public int insertQuestionBase(QuestionBase questionBase);


    /**
     * 编辑试题
     * @param questionBase
     * @param title
     * @param content
     * @return
     */
    public int editQuestion(QuestionBase questionBase,String title,String content);

    /**
     * 修改试题管理
     * 
     * @param questionBase 试题管理
     * @return 结果
     */
    public int updateQuestionBase(QuestionBase questionBase);

    /**
     * 批量删除试题管理
     * 
     * @param ids 需要删除的试题管理主键集合
     * @return 结果
     */
    public int deleteQuestionBaseByIds(Integer[] ids);

    /**
     * 删除试题管理信息
     * 
     * @param id 试题管理主键
     * @return 结果
     */
    public int deleteQuestionBaseById(Integer id);

    /**
     * 导入试题
     * @param questions 试题列表
     * @param uuid 导入业务流水号
     * @param userId 操作用户id
     * @param deptId 操作用户部门id
     * @param repoIdMap 章节id信息
     */
    void importQuestions(List<QuestionTemplate> questions, String uuid, Long userId,Long deptId,HashMap<String,Integer> repoIdMap);

    /**
     * 试题导入进度监测
     * @param uuid 导入业务流水号
     * @return
     */
    MonitorResult importMonitor(String uuid);

    /**
     * 校验题库章节名称，重复、不存在则抛出异常
     * @param questions
     * @return 返回章节名称和repoId对应关系
     */
    HashMap<String, Integer> validateRepoName(List<QuestionTemplate> questions);

    /**
     * 导出试题
     * @param response
     * @param type 1-excel,2-word,3-pdf
     * @param ids
     */
    void exportQuestion(HttpServletResponse response, String type, Integer[] ids);

    /**
     * 根据试题信息构建导出模板
     * @param questions
     * @param questionSource 获取试题来源
     * @return
     */
    List<QuestionTemplate> buildQuestionTemplate(List<QuestionBase> questions, QuestionSourceEnum questionSource);
}
